home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-02-09 | 3.1 KB | 131 lines | [TEXT/Mrls] |
- module: dylan-user
- author: Patrick C. Beard <beard@cs.ucdavis.edu>
- synopsis: classes for menus -- implementation.
-
- /*
- define module Menus
- use dylan, export: all;
- export
- <menu>,
-
- menu-dispose, menu-insert, menu-delete, menu-draw;
- end module Menus;
- */
-
- define variable *dylan-menus* = make(<table>);
-
- define class <menu> (<object>)
- slot title :: <string>,
- required-init-keyword: title:;
- slot id :: <small-integer>,
- required-init-keyword: id:;
- slot items :: <list>,
- required-init-keyword: items:;
- slot behavior :: <method>,
- required-init-keyword: behavior:;
- slot adjuster :: <method>,
- init-value: #f,
- init-keyword: adjuster:;
- slot pointer :: union(<foreign-pointer>, singleton(#f));
- slot inserted :: <boolean>;
- end class;
-
- define method initialize (self :: <menu>, #key, #all-keys)
- next-method();
- self.pointer := %new-menu(self.title, self.id, self.items);
- self.inserted := #f;
- end method;
-
- define method menu-dispose (self :: <menu>)
- if (self.pointer)
- if (self.inserted)
- menu-delete(self);
- end if;
- %dispose-menu(self.pointer);
- self.pointer := #f;
- end if;
- end method;
-
- define method menu-insert (self :: <menu>)
- if (self.pointer & ~self.inserted)
- %insert-menu(self.pointer);
- *dylan-menus*[self.title] := self;
- self.inserted := #t;
- end if
- end method;
-
- define method menu-delete (self :: <menu>)
- if (self.pointer & self.inserted)
- %delete-menu(self.pointer);
- *dylan-menus*[self.title] := #f;
- self.inserted := #f;
- end if;
- end method;
-
- define method menu-draw ()
- %draw-menus();
- end method;
-
- define method menu-enable-item (self :: <menu>, item :: <string>)
- if (self.pointer)
- %set-item-states(self.pointer, list(item), #(#t));
- end if;
- end method;
-
- define method menu-disable-item (self :: <menu>, item :: <string>)
- if (self.pointer)
- %set-item-states(self.pointer, list(item), #(#f));
- end if;
- end method;
-
- // set a bunch of states at once.
-
- define method menu-set-item-states(self :: <menu>, items :: <list>, states :: <list>)
- if (self.pointer)
- %set-item-states(self.pointer, items, states);
- end if;
- end method;
-
- // methods called by the system.
-
- define constant dispatch-adjust-menus = method ()
- for (menu in *dylan-menus*)
- if (menu & menu.adjuster)
- menu.adjuster(menu);
- end if;
- end for;
- end method;
-
- define constant dispatch-menu-selection = method (title :: <string>, item :: <string>)
- let menu = *dylan-menus*[title];
- if (menu)
- // invoke the menu item.
- menu.behavior(menu, item);
- // give the menu the chance to change state.
- if (menu.adjuster)
- menu.adjuster(menu);
- end if;
- end if;
- end method;
-
- /*
- define variable *beeper* = method(menu :: <menu>, item :: <string>)
- beep();
- end;
- define variable *printer* = method(menu :: <menu>, item :: <string>)
- princ(concatenate("selected “", item, "”"));
- end;
- define variable *menu* = make(<menu>, title: "Test", id: 1000,
- items: #("Help", "Me", "Spock"), behavior: *printer*);
- menu-insert(*menu*);
- menu-draw();
- // test out menu dispatching.
- dispatch-menu-selection("Test", "Help");
- dispatch-menu-selection("Test", "Me");
- dispatch-menu-selection("Test", "Spock");
- menu-delete(*menu*);
- menu-draw();
- menu-dispose(*menu*);
- menu-draw();
- */
-